(function(f){if(typeof exports==='object'&&typeof module!=='undefined'){module.exports=f()}else if(typeof define==='function'&&define.amd){define([], f)}else{var g;if(typeof window!=='undefined'){g=window}else if(typeof global!=='undefined'){g=global}else if(typeof self!=='undefined'){g=self}else{g=this}g.protocolCheck = f()}})(function(){var define, module, exports;return (function e(t, n, r){function s(o, u){if(!n[o]){if(!t[o]){var a=typeof require=='function'&&require;if(!u&&a)return a(o, !0);if(i)return i(o, !0);var f=new Error('Cannot find module \''+o+'\'');throw f.code='MODULE_NOT_FOUND', f}var l=n[o]={ exports:{} };t[o][0].call(l.exports, function(e){var n=t[o][1][e];return s(n?n:e)}, l, l.exports, e, t, n, r)}return n[o].exports}var i=typeof require=='function'&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({ 1:[function(require, module, exports){
  function _registerEvent(target, eventType, cb) {
    if (target.addEventListener) {
      target.addEventListener(eventType, cb)
      return {
        remove: function () {
          target.removeEventListener(eventType, cb)
        }
      }
    } else {
      target.attachEvent(eventType, cb)
      return {
        remove: function () {
          target.detachEvent(eventType, cb)
        }
      }
    }
  }

  function _createHiddenIframe(target, uri) {
    var iframe = document.createElement('iframe')
    iframe.src = uri
    iframe.id = 'hiddenIframe'
    iframe.style.display = 'none'
    target.appendChild(iframe)

    return iframe
  }

  function openUriWithHiddenFrame(uri, failCb, successCb) {

    var timeout = setTimeout(function () {
      failCb()
      handler.remove()
    }, 1000)

    var iframe = document.querySelector('#hiddenIframe')
    if (!iframe) {
      iframe = _createHiddenIframe(document.body, 'about:blank')
    }

    var handler = _registerEvent(window, 'blur', onBlur)

    function onBlur() {
      clearTimeout(timeout)
      handler.remove()
      successCb()
    }

    iframe.contentWindow.location.href = uri
  }

  function openUriWithTimeoutHack(uri, failCb, successCb) {
    
    var timeout = setTimeout(function () {
      failCb()
      handler.remove()
    }, 1000)

    // handle page running in an iframe (blur must be registered with top level window)
    var target = window
    while (target != target.parent) {
      target = target.parent
    }

    var handler = _registerEvent(target, 'blur', onBlur)

    function onBlur() {
      clearTimeout(timeout)
      handler.remove()
      successCb()
    }

    window.location = uri
  }

  function openUriUsingFirefox(uri, failCb, successCb) {
    var iframe = document.querySelector('#hiddenIframe')

    if (!iframe) {
      iframe = _createHiddenIframe(document.body, 'about:blank')
    }

    try {
      iframe.contentWindow.location.href = uri
      successCb()
    } catch (e) {
      if (e.name == 'NS_ERROR_UNKNOWN_PROTOCOL') {
        failCb()
      }
    }
  }

  function openUriUsingIEInOlderWindows(uri, failCb, successCb) {
    if (getInternetExplorerVersion() === 10) {
      openUriUsingIE10InWindows7(uri, failCb, successCb)
    } else if (getInternetExplorerVersion() === 9 || getInternetExplorerVersion() === 11) {
      openUriWithHiddenFrame(uri, failCb, successCb)
    } else {
      openUriInNewWindowHack(uri, failCb, successCb)
    }
  }

  function openUriUsingIE10InWindows7(uri, failCb, successCb) {
    var timeout = setTimeout(failCb, 1000)
    window.addEventListener('blur', function () {
      clearTimeout(timeout)
      successCb()
    })

    var iframe = document.querySelector('#hiddenIframe')
    if (!iframe) {
      iframe = _createHiddenIframe(document.body, 'about:blank')
    }
    try {
      iframe.contentWindow.location.href = uri
    } catch (e) {
      failCb()
      clearTimeout(timeout)
    }
  }

  function openUriInNewWindowHack(uri, failCb, successCb) {
    var myWindow = window.open('', '', 'width=0,height=0')

    myWindow.document.write('<iframe src=\'' + uri + '\'></iframe>')

    setTimeout(function () {
      try {
        myWindow.location.href
        myWindow.setTimeout('window.close()', 1000)
        successCb()
      } catch (e) {
        myWindow.close()
        failCb()
      }
    }, 1000)
  }

  function openUriWithMsLaunchUri(uri, failCb, successCb) {
    navigator.msLaunchUri(uri,
      successCb,
      failCb
    )
  }

  function checkBrowser() {
    var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0
    var ua = navigator.userAgent.toLowerCase()
    return {
      isOpera   : isOpera,
      isFirefox : typeof InstallTrigger !== 'undefined',
      isSafari  : (~ua.indexOf('safari') && !~ua.indexOf('chrome')) || Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0,
      isIOS     : /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream,
      isChrome  : !!window.chrome && !isOpera,
      isIE      : /* @cc_on!@*/false || !!document.documentMode // At least IE6
    }
  }

  function getInternetExplorerVersion() {
    var rv = -1
    if (navigator.appName === 'Microsoft Internet Explorer') {
      var ua = navigator.userAgent
      var re = new RegExp('MSIE ([0-9]{1,}[\.0-9]{0,})')
      if (re.exec(ua) != null)
        rv = parseFloat(RegExp.$1)
    }
    else if (navigator.appName === 'Netscape') {
      var ua = navigator.userAgent
      var re = new RegExp('Trident/.*rv:([0-9]{1,}[\.0-9]{0,})')
      if (re.exec(ua) != null) {
        rv = parseFloat(RegExp.$1)
      }
    }
    return rv
  }

  module.exports = function(uri, failCb, successCb, unsupportedCb) {
    function failCallback() {
      failCb && failCb()
    }

    function successCallback() {
      successCb && successCb()
    }

    if (navigator.msLaunchUri) { // for IE and Edge in Win 8 and Win 10
      openUriWithMsLaunchUri(uri, failCb, successCb)
    } else {
      var browser = checkBrowser()

      if (browser.isFirefox) {
        openUriUsingFirefox(uri, failCallback, successCallback)
      } else if (browser.isChrome || browser.isIOS) {
        openUriWithTimeoutHack(uri, failCallback, successCallback)
      } else if (browser.isIE) {
        openUriUsingIEInOlderWindows(uri, failCallback, successCallback)
      } else if (browser.isSafari) {
        openUriWithHiddenFrame(uri, failCallback, successCallback)
      } else {
        unsupportedCb()
        // not supported, implement please
      }
    }
  }

}, {}] }, {}, [1])(1)
})